package com.xinxiang.activemq;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import javax.jms.BytesMessage;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;

import com.alibaba.fastjson.JSONObject;
import com.tibco.tibjms.TibjmsQueueConnectionFactory;

/**
 * 
 * <pre>
 * 【类型】: PubTibcoSend <br/> 
 * 【作用】: 发送接收队列工具. <br/>  
 * 【时间】：2017年3月13日 下午3:58:43 <br/> 
 * 【作者】：张朝辉 <br/>
 * </pre>
 */
class PubTibco {

    /**
     * 
     * 【方法名】 : sendJmsInfo(发送、接收队列信息). <br/>
     * 【注意】: .<br/>
     * 【作者】: 张朝辉 .<br/>
     * 【时间】： 2017年3月13日 下午3:54:48 .<br/>
     * 【参数】： .<br/>
     * 
     * @param url
     *            请求地址
     * @param sendDescName
     *            发送队列名
     * @param recDescName
     *            接收队列名
     * @param str
     *            发送数据
     * @param isRecFalg
     *            是否接收返回
     * @param userName
     *            用户名
     * @param passWord
     *            密码
     * @param sendUncode
     *            发送编码
     * @param uncode
     *            接收编码
     * @return String .<br/>
     *         <p>
     *         修改记录.<br/>
     *         修改人: 张朝辉 修改描述：创建新新件 .<br/>
     *         <p/>
     */
    public static String sendJmsInfo(String url, String sendDescName, String recDescName, String str, Boolean isRecFalg, String userName, String passWord, String sendUncode, String uncode) {
        TibjmsQueueConnectionFactory tqc = null;
        QueueSession sendSession = null;
        QueueSession recSession = null;
        QueueConnection conn = null;

        MessageProducer mp = null;
        QueueReceiver receiver = null;
        String logno = getOnlyPK();
//        LogPay.info("发送地址为=====>>>" + url);
//        LogPay.info("发送队列=====>>>" + sendDescName);
//        LogPay.info("发送数据=====>>>" + str);

        try {
            tqc = new TibjmsQueueConnectionFactory(url);
            conn = tqc.createQueueConnection(userName, passWord);
            conn.start();

            /** 初始化数据-得到连接 */

            sendSession = conn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
            Queue sendQ = sendSession.createQueue(sendDescName);
            mp = sendSession.createProducer(sendQ);

            BytesMessage message = sendSession.createBytesMessage();
            message.setJMSCorrelationID(logno);
            message.writeBytes(str.getBytes(sendUncode));
            mp.send(message);
            if (isRecFalg == Boolean.TRUE) {
                recSession = conn.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);
                Queue recQueue = recSession.createQueue(recDescName);
                receiver = recSession.createReceiver(recQueue, "JMSCorrelationID='" + logno + "'");
                BytesMessage receive = (javax.jms.BytesMessage) receiver.receive(28000);
                byte[] bmessage = new byte[(int) receive.getBodyLength()];
                receive.readBytes(bmessage);
                receive.acknowledge();

                String content = new String(bmessage, uncode);
//                 LogPay.info("接收队列数据=====[" + recDescName + "]>>>" + content);
                return content;
            }
            return null;
        } catch (Exception e) {
//             LogPay.info("接收和发送队列异常：" + e.getMessage(), e);
        } finally {
            try {
                if (mp != null) {
                    mp.close();
                }
                if (receiver != null) {
                    receiver.close();
                }
                if (recSession != null) {
                    recSession.close();
                }
                if (sendSession != null) {
                    sendSession.close();
                }
                if (conn != null) {
                    conn.stop();
                    conn.close();
                }
            } catch (JMSException e) {
//                LogPay.info("接收和发送队列，关闭打开服务异常：" + e.getMessage(), e);
            }
        }
        return logno;
    }

    /**
     * 
     * 【方法名】 : sendMessage(发送短信方法). <br/>
     * 【作者】: 张朝辉 .<br/>
     * 【时间】： 2017年3月15日 下午5:38:24 .<br/>
     * 【参数】： .<br/>
     * 
     * @param moblieNo
     *            发送人手机号
     * @param messageText
     *            短信内容 .<br/>
     *            <p>
     *            修改记录.<br/>
     *            修改人: 张朝辉 修改描述：创建新新件 .<br/>
     *            <p/>
     */
    public static void sendMessage(String moblieNo, String messageText) {
        // 组装发送报文
        // 参数：TYPE MOBILENO CHANNEL ORDERID CONTENT
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("ORDERID", "789fsd111122222111115");
        jsonObj.put("MOBILENO", moblieNo);
        jsonObj.put("P_TRANCODE", "DWSMS1001");
        jsonObj.put("CHANNEL", "test");
        jsonObj.put("SMSTYPE", "1");
        jsonObj.put("BRANCHID", "00800075");
        jsonObj.put("TYPE", "1");
        jsonObj.put("CONTENT", messageText);
        // 为用接收编码、发送编码、户名、密码从新赋值
        // 初始化文件内容
        // ParamCanChange.jmsRecUncode = UrlCache.tibcoUncode;
        // ParamCanChange.jmsSendUncode = UrlCache.tibcoSendUncode;
        // ParamCanChange.jmsUserName = UrlCache.tibcoUserName;
        // ParamCanChange.jmsPassword = UrlCache.tibcoPassWord;

        PubTibco.sendJmsInfo("tcp://192.168.1.21:7222", "DWSERVER.OUT", "DWSERVER.IN", jsonObj.toString(), Boolean.parseBoolean("false"), "admin", "", "GBK", "GBK");
    }

    public static synchronized String getOnlyPK() {
        DateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String timePK = df.format(new Date());
        int min = 1000;
        int max = 9999;
        Random rand = new Random();
        int tmp = Math.abs(rand.nextInt());
        tmp = tmp % (max - min + 1) + min;
        return timePK + tmp;
    }

}

public class PubTibcoSend {
    public static void main(String[] args) {
        String moblieNo = "18770919207";
        String messageText = "hello zjy！";
        PubTibco.sendMessage(moblieNo, messageText);
    }

}
